package org.blogwu.sso.until.redisUntil.jdeis;


import org.blogwu.sso.until.string.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import redis.clients.jedis.JedisCluster;

@Component
public class MyRedisTemplate {
	private static final Logger LOGGER    = LoggerFactory.getLogger(MyRedisTemplate.class);

	@Autowired
	private JedisCluster  jedisCluster; //=new JedisClusterConfig().getJedisCluster();

	@Autowired
	private RedisProperties     redisProperties;

	private static final String KEY_SPLIT = ":"; //用于隔开缓存前缀与缓存键值 

	/**
	 * 设置缓存    
	 * @param prefix 缓存前缀（用于区分缓存，防止缓存键值重复）
	 * @param key    缓存key
	 * @param value  缓存value
	 */
	public void set(String prefix, String key, String value) {
		jedisCluster.set(prefix + KEY_SPLIT + key, value);
		LOGGER.debug("RedisUtil:set cache key={},value={}", prefix + KEY_SPLIT + key, value);
	}
	
	

	/**
	 * 设置缓存    在设置前会先检查redis中是否与有key,有则不操作.
	 * @param prefix 缓存前缀（用于区分缓存，防止缓存键值重复）
	 * @param key    缓存key
	 * @param value  缓存value
	 */
	public  void setbyrepeat(String prefix, String key, String value){
		String repeatKey=jedisCluster.get(prefix + KEY_SPLIT + key);
		if(StringUtils.isBlank(repeatKey)){
			jedisCluster.set(prefix + KEY_SPLIT + key, value);
			LOGGER.debug("RedisUtil:set cache key={},value={}", prefix + KEY_SPLIT + key, value);
		}else{
			LOGGER.debug("the key "+key+"is repeat");
		}
	}
	
	

	/**
	 * 设置缓存，并且自己指定过期时间
	 * @param prefix
	 * @param key
	 * @param value
	 * @param expireTime 过期时间
	 */
	public void setWithExpireTime(String prefix, String key, String value, int expireTime) {
		jedisCluster.setex(prefix + KEY_SPLIT + key, expireTime, value);
		LOGGER.debug("RedisUtil:setWithExpireTime cache key={},value={},expireTime={}", prefix + KEY_SPLIT + key, value,
				expireTime);
	}

	/**
	 * 设置缓存，并且由配置文件指定过期时间
	 * @param prefix
	 * @param key
	 * @param value
	 */
	public void setWithExpireTime(String prefix, String key, String value) {
		int EXPIRE_SECONDS = redisProperties.getExpireSeconds();
		jedisCluster.setex(prefix + KEY_SPLIT + key, EXPIRE_SECONDS, value);
		LOGGER.debug("RedisUtil:setWithExpireTime cache key={},value={},expireTime={}", prefix + KEY_SPLIT + key, value,
				EXPIRE_SECONDS);
	}

	/**
	 * 获取指定key的缓存
	 * @param prefix  缓存前缀
	 * @param key
	 */
	public String get(String prefix, String key) {
		String value = jedisCluster.get(prefix + KEY_SPLIT + key);
		LOGGER.debug("RedisUtil:get cache key={},value={}", prefix + KEY_SPLIT + key, value);
		return value;
	}

	/**
	 * 
	 * <p>获取指定key的缓存(无缓存前缀)</p>
	 * @Title: getNoPrefix
	 * @param  @param key
	 * @param  @return    参数
	 * @return String  返回类型
	 * @date 2016年12月1日 上午12:22:29 
	 * @version V1.0
	 * @author xiaohu
	 *
	 */
	public String getNoPrefix(String key){
		String value = jedisCluster.get(key);
		LOGGER.debug("RedisUtil:get cache key={},value={}",key, value);
		return value;
	}

	/**
	 * 
	 * <p>设置缓存, times  过期时间</p>
	 * @Title: setNoPrefix
	 * @param  @param key
	 * @param  @param value
	 * @param  @param times    过期时间
	 * @return void  返回类型
	 * @date 2016年12月1日 上午12:28:03 
	 * @version V1.0
	 * @author xiaohu
	 *
	 */
	public void setNoPrefix(String key,String value,int times){
		jedisCluster.setex(key, times, value);
		LOGGER.debug("RedisUtil:setWithExpireTime cache key={},value={},expireTime={}", key, value,
				times);
	}

	/**
	 * 删除指定key的缓存
	 * @param prefix
	 * @param key
	 */
	public void deleteWithPrefix(String prefix, String key) {
		jedisCluster.del(prefix + KEY_SPLIT + key);
		LOGGER.debug("RedisUtil:delete cache key={}", prefix + KEY_SPLIT + key);
	}

	public void delete(String key) {
		jedisCluster.del(key);
		LOGGER.debug("RedisUtil:delete cache key={}", key);
	}

	public JedisCluster getJedisCluster() {
		return jedisCluster;
	}

	public void setJedisCluster(JedisCluster jedisCluster) {
		this.jedisCluster = jedisCluster;
	}

	public RedisProperties getRedisProperties() {
		return redisProperties;
	}

	public void setRedisProperties(RedisProperties redisProperties) {
		this.redisProperties = redisProperties;
	}



}